Inauguration speech, known as the first official speech that the new US President will give to the world, shows that how the President and his team will lead the country and how this country will develop in the next four years. More or less, the inauguration speech also illustrates the character of the President and his attitude towards this special position. What these Presidents have said reflects what points has this country focused on and what problems has this country been faced. Therefore, it is interesting and meaningful to analyze the differences among these inauguration speeches.
Did Trump do well in the Inauguration Speech?
From the chart above, it is obvious but not surprise to see that President Trump gave the world a simple and short inaugural speech. The number of sentences, the average words per sentence, the total words, the total vocabulary are the smallest in recent several decades. Especially for the total vocabulary, he used 579 different words in his speech, much less than the average level of the inauguration speech.
One of the possible reasons is that President Trump wants to show citizens a different personal style compared with those Presidents known as famous politicians. Actually, this is one of the reasons why he could get such a huge amount of supporters. From the inauguration speech, he has already started his plan making some changes in this country. Or maybe just as he said he didn’t want people standing out in the cold for a long time.
To visualize how inauguration speeches changed over time, I made following four plots.
Let’s focus on how inauguration speeches have changed

As time goes on, in inauguration speech, the total words and total vacabulary have not changed a lot and this value has turned to be stable in recent several decades. From the figure, we can see that in early days, it was usual that the total words of one year was much more or less than the next year or the previous year. But nowadays, this number has been stabilized to be around 2000. This is because the inauguration speech has played a more and more important role these years. Presidents use it to show his plan and power in the next few years. The best way making a speech serious and formal is to standardize the speech in terms of the length and expression. Thus, the total words have been controlled.

However, if looking at the number of sentences and the average words per sentence, we can find that there is a uptrend for number of sentences and an obvious descend trend for the average words per sentence, which means Presidents started to shorten their sentences. That might because the pace of life turning more and more quick, people have already got used to reading short sentences posted on all kinds of social Apps rather than reading newspapers and long sentences. Indeed, shorter sentences are much more acceptable for people. As a result, Presidents started to talk to all of us by shortening their sentences.
If combining these four figures, we should notice that not the length of the speech but the pace of the speech is changing.
What words did Presidents say?

The word cloud technology shows us what does a President say much during the speech. First, President Clinton, who won the competition against George Bush. As a young politician at that time, he focused on economic revolution. So in his inauguration speech, we can see words like renewal, today, raise, and so on.
As for President George W Bush, just like his father, he focused more on safety problems inside and outside the country. During his term of office, US army invaded Iraq and Afghan. In his inauguration speech, we see tyranny, fire, defend, etc.
President Obama, the only President whose word cloud does not contain the word America. He is known as a person who is really good at speech. In his word cloud, we see journey, creed, technology. He focused on the revolution and he launched a series of new policies during his terms of office. He said in the inauguration speech: Our Journey is not complete.
Finally, President Trump had been focusing on solving the employment problem and protecting domestic workers before he won the presidential election. So during his inauguration speech, we see words like jobs, dreams, everyone factories, protected, etc.
What’s more, I find that three of recent four presidents loved to say “America” in their inauguration speech, especially President Trump, he hit the world for 35 times. So I made a plot to see if there is any trend.
Count the number of “America” in inauguration speeches

From the figure above, beginning from President Warren G. Harding who was the president of the post World War period, the number of the word America has increased in a high speed. The word “America” is a good way to stimulate people’s patriotism during the inauguration speech, also a good way to win people’s hearts.
Sentiment Analysis of Inauguration speeches
Finally, in the sentiment analysis part, whether the sentiment was positive or negative during the whole speech process has been showed in the following figures. Red parts mean positive and blue parts mean negative.

From the plot, both President Trump and Obama has positive and negative emotion during their speeches, but President Trump’s speech has more negative emotion, which known as unusually dark. He said: “For too long, a small group in our nation’s capital has reaped the rewards of government while the people have borne the cost”. But fortunately, he ended with positive altitude:“We will make America strong again. We will make America wealthy again. We will make America proud again.” From the figure, at the end of his speech, the positive emotion went to the highest point.
As for President Bush and President Clinton, since at that time, America was confronted with some serious problems such as economic problems and country safety problems, the inauguration speeches were a little bit negative. From the sentiment analysis, we can see clearly that the blue parts are bigger than the red parts. And the negative emotion appeared at the end of the speech, which means at that time, even the President did not hold a positive attitude towards the future of the country.

To sum up, the sentiment analysis can somehow demonstrates the President’s attitude towards the future of this country.
LS0tCnRpdGxlOiAiV2hhdCBEbyBJbmF1Z3VyYXRpb24gU3BlZWNoZXMgVGVsbCBVcz8iCm91dHB1dDoKICBodG1sX2RvY3VtZW50OiBkZWZhdWx0CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogZGVmYXVsdAotLS0KCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcicsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG91dC53aWR0aD0iNDAwcHgifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiLi4vZmlncy8zLmpwZyIpCmBgYApJbmF1Z3VyYXRpb24gc3BlZWNoLCBrbm93biBhcyB0aGUgZmlyc3Qgb2ZmaWNpYWwgc3BlZWNoIHRoYXQgdGhlIG5ldyBVUyBQcmVzaWRlbnQgd2lsbCBnaXZlIHRvIHRoZSB3b3JsZCwgc2hvd3MgdGhhdCBob3cgdGhlIFByZXNpZGVudCBhbmQgaGlzIHRlYW0gd2lsbCBsZWFkIHRoZSBjb3VudHJ5IGFuZCBob3cgdGhpcyBjb3VudHJ5IHdpbGwgZGV2ZWxvcCBpbiB0aGUgbmV4dCBmb3VyIHllYXJzLiBNb3JlIG9yIGxlc3MsIHRoZSBpbmF1Z3VyYXRpb24gc3BlZWNoIGFsc28gaWxsdXN0cmF0ZXMgdGhlIGNoYXJhY3RlciBvZiB0aGUgUHJlc2lkZW50IGFuZCBoaXMgYXR0aXR1ZGUgdG93YXJkcyB0aGlzIHNwZWNpYWwgcG9zaXRpb24uIFdoYXQgdGhlc2UgUHJlc2lkZW50cyBoYXZlIHNhaWQgcmVmbGVjdHMgd2hhdCBwb2ludHMgaGFzIHRoaXMgY291bnRyeSBmb2N1c2VkIG9uIGFuZCB3aGF0IHByb2JsZW1zIGhhcyB0aGlzIGNvdW50cnkgYmVlbiBmYWNlZC4gVGhlcmVmb3JlLCBpdCBpcyBpbnRlcmVzdGluZyBhbmQgbWVhbmluZ2Z1bCB0byBhbmFseXplIHRoZSBkaWZmZXJlbmNlcyBhbW9uZyB0aGVzZSBpbmF1Z3VyYXRpb24gc3BlZWNoZXMuCmBgYHtyIGxvYWQgbGlicmFyaWVzLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojIFN0ZXAgMDogY2hlY2sgYW5kIGluc3RhbGwgbmVlZGVkIHBhY2thZ2VzLiBMb2FkIHRoZSBsaWJyYXJpZXMgYW5kIGZ1bmN0aW9ucy4gCnBhY2thZ2VzLnVzZWQ9YygicnZlc3QiLCAKICAgICAgICAgICAgICAgICJzZW50aW1lbnRyIiwgInFkYXAiLCJncGxvdHMiLCAiZHBseXIiLAogICAgICAgICAgICAgICAgInRtIiwgInN5dXpoZXQiLCAic2NhbGVzIiwgIlJDb2xvckJyZXdlciIsCiAgICAgICAgICAgICAgICAiUkFOTiIsICJ0bSIsIkRUIiwibGFuZ3VhZ2VSIiwiTkxQIiwib3Blbk5MUCIsIm1hZ3JpdHRyIiwiZ2dwbG90MiIsInRpZHl0ZXh0Iiwid29yZGNsb3VkIiwiZ3JpZCIsImdyaWRFeHRyYSIsImtuaXRyIikKCiMgY2hlY2sgcGFja2FnZXMgdGhhdCBuZWVkIHRvIGJlIGluc3RhbGxlZC4KcGFja2FnZXMubmVlZGVkPXNldGRpZmYocGFja2FnZXMudXNlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgIGludGVyc2VjdChpbnN0YWxsZWQucGFja2FnZXMoKVssMV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMudXNlZCkpCiMgaW5zdGFsbCBhZGRpdGlvbmFsIHBhY2thZ2VzCmlmKGxlbmd0aChwYWNrYWdlcy5uZWVkZWQpPjApewogIGluc3RhbGwucGFja2FnZXMocGFja2FnZXMubmVlZGVkLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQp9CgojIGxvYWQgcGFja2FnZXMKbGlicmFyeSgicnZlc3QiKQpsaWJyYXJ5KCJxZGFwIikKbGlicmFyeSgic2VudGltZW50ciIpCmxpYnJhcnkoImdwbG90cyIpCmxpYnJhcnkoImRwbHlyIikKbGlicmFyeSgidG0iKQpsaWJyYXJ5KCJzeXV6aGV0IikKbGlicmFyeSgic2NhbGVzIikKbGlicmFyeSgiUkNvbG9yQnJld2VyIikKbGlicmFyeSgiUkFOTiIpCmxpYnJhcnkoIkRUIikKbGlicmFyeSgibGFuZ3VhZ2VSIikKbGlicmFyeSgiTkxQIikKbGlicmFyeSgib3Blbk5MUCIpCmxpYnJhcnkoIm1hZ3JpdHRyIikKbGlicmFyeSgiZ2dwbG90MiIpCmxpYnJhcnkoInRpZHl0ZXh0IikKbGlicmFyeSgid29yZGNsb3VkIikKbGlicmFyeSgiZ3JpZCIpCmxpYnJhcnkoImdyaWRFeHRyYSIpCmxpYnJhcnkoImtuaXRyIikKCgpzb3VyY2UoIi4uL2xpYi9wbG90c3RhY2tlZC5SIikKc291cmNlKCIuLi9saWIvc3BlZWNoRnVuY3MuUiIpCmBgYAoKYGBge3IgRGF0YSBIYXJ2ZXN0LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojIFN0ZXAgMTogRGF0YSBoYXJ2ZXN0OiBzY3JhcCBzcGVlY2ggVVJMcyBmcm9tIDxodHRwOi8vd3d3LnByZXNpZGVuY3kudWNzYi5lZHUvPi4KCiNGb2xsb3dpbmcgdGhlIGV4YW1wbGUgb2YgW0plcmlkIEZyYW5jb21dKGh0dHA6Ly9mcmFuY29qYy5naXRodWIuaW8vd2ViLXNjcmFwaW5nLXdpdGgtcnZlc3QvKSwgd2UgdXNlZCBbU2VsZWN0b3JnYWRnZXRdKGh0dHA6Ly9zZWxlY3RvcmdhZGdldC5jb20vKSB0byBjaG9vc2UgdGhlIGxpbmtzIHdlIHdvdWxkIGxpa2UgdG8gc2NyYXAuIEZvciB0aGlzIHByb2plY3QsIHdlIHNlbGVjdGVkIGFsbCBpbmF1Z3VyYWwgYWRkcmVzc2VzIG9mIHBhc3QgcHJlc2lkZW50cy4gCiMjIyBJbmF1Z3VhcmFsIHNwZWVjaGVzCm1haW4ucGFnZSA8LSByZWFkX2h0bWwoeCA9ICJodHRwOi8vd3d3LnByZXNpZGVuY3kudWNzYi5lZHUvaW5hdWd1cmFscy5waHAiKQojIEdldCBsaW5rIFVSTHMKIyBmLnNwZWVjaGxpbmtzIGlzIGEgZnVuY3Rpb24gZm9yIGV4dHJhY3RpbmcgbGlua3MgZnJvbSB0aGUgbGlzdCBvZiBzcGVlY2hlcy4gCmluYXVnPC1mLnNwZWVjaGxpbmtzKG1haW4ucGFnZSkKI2hlYWQoaW5hdWcpCmFzLkRhdGUoaW5hdWdbLDFdLCBmb3JtYXQ9IiVCICVlLCAlWSIpCmluYXVnPC1pbmF1Z1stbnJvdyhpbmF1ZyksXSAjIHJlbW92ZSB0aGUgbGFzdCBsaW5lLCBpcnJlbGV2YW50IGR1ZSB0byBlcnJvci4KCiMgU3RlcCAyOiBVc2luZyBzcGVlY2ggbWV0YWRhdGEgcG9zdGVkIG9uIDxodHRwOi8vd3d3LnByZXNpZGVuY3kudWNzYi5lZHUvPiwgd2UgcHJlcGFyZWQgQ1NWIGRhdGEgc2V0cyBmb3IgdGhlIHNwZWVjaGVzIHdlIHdpbGwgc2NyYXAuIAppbmF1Zy5saXN0PC1yZWFkLmNzdigiLi4vZGF0YS9pbmF1Z2xpc3QuY3N2Iiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQoKI1dlIGFzc2VtYmxlIGFsbCBzY3JhcHBlZCBzcGVlY2hlcyBpbnRvIG9uZSBsaXN0LiBOb3RlIGhlcmUgdGhhdCB3ZSBkb24ndCBoYXZlIHRoZSBmdWxsIHRleHQgeWV0LCBvbmx5IHRoZSBsaW5rcyB0byBmdWxsIHRleHQgdHJhbnNjcmlwdHMuIAoKIyBTdGVwIDM6IHNjcmFwIHRoZSB0ZXh0cyBvZiBzcGVlY2hlcyBmcm9tIHRoZSBzcGVlY2ggVVJMcy4KCnNwZWVjaC5saXN0PC1pbmF1Zy5saXN0CnNwZWVjaC5saXN0JHR5cGU8LXJlcCgiaW5hdWciLCBucm93KGluYXVnLmxpc3QpKQpzcGVlY2gudXJsPC1pbmF1ZwpzcGVlY2gubGlzdDwtY2JpbmQoc3BlZWNoLmxpc3QsIHNwZWVjaC51cmwpCmNvbG5hbWVzKHNwZWVjaC5saXN0KVsxXTwtIlByZXNpZGVudCIKYGBgCgpgYGB7ciBzcGVlY2gubGlzdCxpbmNsdWRlPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojQmFzZWQgb24gdGhlIGxpc3Qgb2Ygc3BlZWNoZXMsIHdlIHNjcmFwIHRoZSBtYWluIHRleHQgcGFydCBvZiB0aGUgdHJhbnNjcmlwdCdzIGh0bWwgcGFnZS4gRm9yIHNpbXBsZSBodG1sIHBhZ2VzIG9mIHRoaXMga2luZCwgIFtTZWxlY3RvcmdhZGdldF0oaHR0cDovL3NlbGVjdG9yZ2FkZ2V0LmNvbS8pIGlzIHZlcnkgY29udmVuaWVudCBmb3IgaWRlbnRpZnlpbmcgdGhlIGh0bWwgbm9kZSB0aGF0IGBydmVzdGAgY2FuIHVzZSB0byBzY3JhcCBpdHMgY29udGVudC4gRm9yIHJlcHJvZHVjaWJpbGl0eSwgd2UgYWxzbyBzYXZlIG91ciBzY3JhcHBlZCBzcGVlY2hlcyBpbnRvIG91ciBsb2NhbCBmb2xkZXIgYXMgaW5kaXZpZHVhbCBzcGVlY2ggZmlsZXMuIAojIExvb3Agb3ZlciBlYWNoIHJvdyBpbiBzcGVlY2gubGlzdApzcGVlY2gubGlzdCRmdWxsdGV4dDwtTkEKZm9yKGkgaW4gc2VxKG5yb3coc3BlZWNoLmxpc3QpKSkgewogIHRleHQgPC0gcmVhZF9odG1sKHNwZWVjaC5saXN0JHVybHNbaV0pICU+JSAjIGxvYWQgdGhlIHBhZ2UKICAgIGh0bWxfbm9kZXMoIi5kaXNwbGF5dGV4dCIpICU+JSAjIGlzbG9hdGUgdGhlIHRleHQKICAgIGh0bWxfdGV4dCgpICMgZ2V0IHRoZSB0ZXh0CiAgc3BlZWNoLmxpc3QkZnVsbHRleHRbaV09dGV4dH0KIyBDcmVhdGUgdGhlIGZpbGUgbmFtZQojICBmaWxlbmFtZSA8LSBwYXN0ZTAoIi4uL2RhdGEvZnVsbHRleHQvIiwgCiMgICAgICAgICAgICAgICAgICAgICBzcGVlY2gubGlzdCR0eXBlW2ldLAojICAgICAgICAgICAgICAgICAgICAgc3BlZWNoLmxpc3QkRmlsZVtpXSwgIi0iLCAKIyAgICAgICAgICAgICAgICAgICAgIHNwZWVjaC5saXN0JFRlcm1baV0sICIudHh0IikKIyAgc2luayhmaWxlID0gZmlsZW5hbWUpICU+JSAjIG9wZW4gZmlsZSB0byB3cml0ZSAKIyAgY2F0KHRleHQpICAjIHdyaXRlIHRoZSBmaWxlCiMgIHNpbmsoKSAjIGNsb3NlIHRoZSBmaWxlCiN9CmBgYAoKYGBge3Igc2VudGVuY2UubGlzdCxpbmNsdWRlPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpzZW50ZW5jZS5saXN0PC1OVUxMCmZvcihpIGluIDE6bnJvdyhzcGVlY2gubGlzdCkpewogIHNlbnRlbmNlczwtc2VudF9kZXRlY3Qoc3BlZWNoLmxpc3QkZnVsbHRleHRbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgIGVuZG1hcmtzID0gYygiPyIsICIuIiwgIiEiLCAifCIsIjsiKSkKICBpZihsZW5ndGgoc2VudGVuY2VzKT4wKXsKICAgIGVtb3Rpb25zPC1nZXRfbnJjX3NlbnRpbWVudChzZW50ZW5jZXMpCiAgICB3b3JkLmNvdW50PC13b3JkX2NvdW50KHNlbnRlbmNlcykKICAgICMgY29sbmFtZXMoZW1vdGlvbnMpPXBhc3RlMCgiZW1vLiIsIGNvbG5hbWVzKGVtb3Rpb25zKSkKICAgICMgaW4gY2FzZSB0aGUgd29yZCBjb3VudHMgYXJlIHplcm9zPwogICAgZW1vdGlvbnM9ZGlhZygxLyh3b3JkLmNvdW50KzAuMDEpKSUqJWFzLm1hdHJpeChlbW90aW9ucykKICAgIHNlbnRlbmNlLmxpc3Q8LXJiaW5kKHNlbnRlbmNlLmxpc3QsIAogICAgICAgICAgICAgICAgICAgICAgICBjYmluZChzcGVlY2gubGlzdFtpLC1uY29sKHNwZWVjaC5saXN0KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnRlbmNlcz1hcy5jaGFyYWN0ZXIoc2VudGVuY2VzKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQuY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtb3Rpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50LmlkPTE6bGVuZ3RoKHNlbnRlbmNlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgKQogIH0KfQoKc2VudGVuY2UubGlzdDwtCiAgc2VudGVuY2UubGlzdCU+JQogIGZpbHRlcighaXMubmEod29yZC5jb3VudCkpIApgYGAKCiMjIyBEaWQgVHJ1bXAgZG8gd2VsbCBpbiB0aGUgSW5hdWd1cmF0aW9uIFNwZWVjaD8KCmBgYHtyIGRhdGF0YWJsZSwgaW5jbHVkZT1GQUxTRX0Kc2VudGVuY2UubGlzdC5zZWw8LWZpbHRlcihzZW50ZW5jZS5saXN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT09ImluYXVnIiwgVGVybT09MSkKc2VudGVuY2UubGlzdC5zZWwkRmlsZTwtZmFjdG9yKHNlbnRlbmNlLmxpc3Quc2VsJEZpbGUpCgpudW1iZXJfb2Zfc2VudGVuY2VzPC10YXBwbHkoc2VudGVuY2UubGlzdC5zZWwkc2VudGVuY2VzLCBzZW50ZW5jZS5saXN0LnNlbCRQcmVzaWRlbnQsIGxlbmd0aCkjIG51bWJlciBvZiBzZW50ZW5jZXMKYXZlcmFnZV93b3Jkc19wZXJfc2VudGVuY2U8LXJvdW5kKHRhcHBseShzZW50ZW5jZS5saXN0LnNlbCR3b3JkLmNvdW50LCBzZW50ZW5jZS5saXN0LnNlbCRQcmVzaWRlbnQsIG1lYW4pLDApICMgYXZlcmFnZSB3b3JkcyBwZXIgc2VudGVuY2UKdG90YWxfd29yZHM8LXRhcHBseShzZW50ZW5jZS5saXN0LnNlbCR3b3JkLmNvdW50LCBzZW50ZW5jZS5saXN0LnNlbCRQcmVzaWRlbnQsIHN1bSkKY291bnQ8LWRhdGEuZnJhbWUobnVtYmVyX29mX3NlbnRlbmNlcywgYXZlcmFnZV93b3Jkc19wZXJfc2VudGVuY2UsIHRvdGFsX3dvcmRzKQoKZmlsZW5hbWVzIDwtIFN5cy5nbG9iKCIuLi9kYXRhL2Z1bGx0ZXh0LyotMS50eHQiKQoKdGV4dHMgPC0gZmlsZW5hbWVzICU+JQogIGxhcHBseShyZWFkTGluZXMpICU+JQogIGxhcHBseShwYXN0ZTAsIGNvbGxhcHNlID0gIiAiKSAlPiUKICBsYXBwbHkoYXMuU3RyaW5nKQoKbmFtZXModGV4dHMpIDwtIHN1YnN0cihiYXNlbmFtZShmaWxlbmFtZXMpLDYsbmNoYXIoYmFzZW5hbWUoZmlsZW5hbWVzKSktNCkKCmFubm90YXRlX2VudGl0aWVzIDwtIGZ1bmN0aW9uKGRvYywgYW5ub3RhdGlvbl9waXBlbGluZSkgewogIGFubm90YXRpb25zIDwtICBOTFA6OmFubm90YXRlKGRvYywgYW5ub3RhdGlvbl9waXBlbGluZSkKICBBbm5vdGF0ZWRQbGFpblRleHREb2N1bWVudChkb2MsIGFubm90YXRpb25zKQp9CgppdGluZXJhbnRzX3BpcGVsaW5lIDwtbGlzdChNYXhlbnRfU2VudF9Ub2tlbl9Bbm5vdGF0b3IoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4ZW50X1dvcmRfVG9rZW5fQW5ub3RhdG9yKCkpCgp0ZXh0c19hbm5vdGF0ZWQgPC0gbGFwcGx5KHRleHRzLCBhbm5vdGF0ZV9lbnRpdGllcywgaXRpbmVyYW50c19waXBlbGluZSkKI2NsYXNzKHRleHRzX2Fubm90YXRlZCkKd29yZHM8LWxhcHBseSh0ZXh0c19hbm5vdGF0ZWQsIHdvcmRzKQojY2xhc3Mod29yZHMpCgoKY291bnQkdm9jYWJ1bGFyeTwtd29yZHMlPiVsYXBwbHkodW5pcXVlKSAlPiVzYXBwbHkobGVuZ3RoKQpjb3VudCR0b3RhbF93b3Jkc1szXTwtMjM5NTtjb3VudCRhdmVyYWdlX3dvcmRzX3Blcl9zZW50ZW5jZVszXTwtMTkKY291bnQkdG90YWxfd29yZHNbMjNdPC0xMzY2OyBjb3VudCRhdmVyYWdlX3dvcmRzX3Blcl9zZW50ZW5jZVsyM108LTI0CmNvdW50JHRvdGFsX3dvcmRzWzI4XTwtMjQyNzsgY291bnQkYXZlcmFnZV93b3Jkc19wZXJfc2VudGVuY2VbMjhdPC0xNwpjb3VudCR0b3RhbF93b3Jkc1s3XTwtMjQ1OTsgY291bnQkYXZlcmFnZV93b3Jkc19wZXJfc2VudGVuY2VbN108LTE4Cgpjb2xuYW1lcyhjb3VudCk8LWMoIk51bWJlciBvZiBTZW50ZW5jZXMiLCAiQXZlcmFnZSBXb3JkcyBQZXIgU2VudGVuY2UiLCJUb3RhbCBXb3JkcyIsIlRvdGFsIFZvY2FidWxhcnkiKQoKQXZlcmFnZTwtYyhtZWFuKGNvdW50JGBOdW1iZXIgb2YgU2VudGVuY2VzYCksbWVhbihjb3VudCRgQXZlcmFnZSBXb3JkcyBQZXIgU2VudGVuY2VgKSxtZWFuKGNvdW50JGBUb3RhbCBXb3Jkc2ApLG1lYW4oY291bnQkYFRvdGFsIFZvY2FidWxhcnlgKSkKQXZlcmFnZTwtcm91bmQoQXZlcmFnZSwwKQpuYW1lcyhBdmVyYWdlKTwtY29sbmFtZXMoY291bnQpCmNvdW50PC1yYmluZChBdmVyYWdlLGNvdW50KQpyb3duYW1lcyhjb3VudClbMV08LSJhdmVyYWdlIgoKcHJlc2lkZW50Lm9yZGVyPC1jKCJhdmVyYWdlIixyZXYoZmlsdGVyKHNwZWVjaC5saXN0LCBUZXJtPT0xLHR5cGU9PSJpbmF1ZyIpJFByZXNpZGVudCkpCmNvdW50MTwtZGF0YS5mcmFtZSgpCmZvcihpIGluIDE6NDApewphPC1jb3VudFtyb3duYW1lcyhjb3VudCkgPT0gcHJlc2lkZW50Lm9yZGVyW2ldLF0KY291bnQxPC1yYmluZChjb3VudDEsYSkKfQpgYGAKCgpgYGB7ciwgZWNobz1GQUxTRX0KZGF0YXRhYmxlKGNvdW50MSwgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwKSkKYGBgCgoKCgoKCkZyb20gdGhlIGNoYXJ0IGFib3ZlLCBpdCBpcyBvYnZpb3VzIGJ1dCBub3Qgc3VycHJpc2UgdG8gc2VlIHRoYXQgUHJlc2lkZW50IFRydW1wIGdhdmUgdGhlIHdvcmxkIGEgc2ltcGxlIGFuZCBzaG9ydCBpbmF1Z3VyYWwgc3BlZWNoLiBUaGUgbnVtYmVyIG9mIHNlbnRlbmNlcywgdGhlIGF2ZXJhZ2Ugd29yZHMgcGVyIHNlbnRlbmNlLCB0aGUgdG90YWwgd29yZHMsIHRoZSB0b3RhbCB2b2NhYnVsYXJ5IGFyZSB0aGUgc21hbGxlc3QgaW4gcmVjZW50IHNldmVyYWwgZGVjYWRlcy4gRXNwZWNpYWxseSBmb3IgdGhlIHRvdGFsIHZvY2FidWxhcnksIGhlIHVzZWQgNTc5IGRpZmZlcmVudCB3b3JkcyBpbiBoaXMgc3BlZWNoLCBtdWNoIGxlc3MgdGhhbiB0aGUgYXZlcmFnZSBsZXZlbCBvZiB0aGUgaW5hdWd1cmF0aW9uIHNwZWVjaC4gCgpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBvdXQud2lkdGg9IjQwMHB4In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi4uL2ZpZ3MvMS5wbmciKQpgYGAKCk9uZSBvZiB0aGUgcG9zc2libGUgcmVhc29ucyBpcyB0aGF0IFByZXNpZGVudCBUcnVtcCB3YW50cyB0byBzaG93IGNpdGl6ZW5zIGEgZGlmZmVyZW50IHBlcnNvbmFsIHN0eWxlIGNvbXBhcmVkIHdpdGggdGhvc2UgUHJlc2lkZW50cyBrbm93biBhcyBmYW1vdXMgcG9saXRpY2lhbnMuIEFjdHVhbGx5LCB0aGlzIGlzIG9uZSBvZiB0aGUgcmVhc29ucyB3aHkgaGUgY291bGQgZ2V0IHN1Y2ggYSBodWdlIGFtb3VudCBvZiBzdXBwb3J0ZXJzLiBGcm9tIHRoZSBpbmF1Z3VyYXRpb24gc3BlZWNoLCBoZSBoYXMgYWxyZWFkeSBzdGFydGVkIGhpcyBwbGFuIG1ha2luZyBzb21lIGNoYW5nZXMgaW4gdGhpcyBjb3VudHJ5LiBPciBtYXliZSBqdXN0IGFzIGhlIHNhaWQgaGUgZGlkbid0IHdhbnQgcGVvcGxlIHN0YW5kaW5nIG91dCBpbiB0aGUgY29sZCBmb3IgYSBsb25nIHRpbWUuCgpUbyB2aXN1YWxpemUgaG93IGluYXVndXJhdGlvbiBzcGVlY2hlcyBjaGFuZ2VkIG92ZXIgdGltZSwgSSBtYWRlIGZvbGxvd2luZyBmb3VyIHBsb3RzLgoKIyMjIExldCdzIGZvY3VzIG9uIGhvdyBpbmF1Z3VyYXRpb24gc3BlZWNoZXMgaGF2ZSBjaGFuZ2VkCgpgYGB7ciB3b3JkcGxvdCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KdGhlbWUud2lkZWJhciA8LQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIkdpbGwgU2FucyIsIGNvbG9yID0gIiM0NDQ0NDQiKSkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAuNCkpKwogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTApKSsKICB0aGVtZShheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEyKSkKCmRhdGExPC1jb3VudDFbLTEsXQpkYXRhMTwtZGF0YTFbMzk6MSxdCmRhdGExJHByZXNpZGVudDwtcm93bmFtZXMoZGF0YTEpCgpkYXRhMSRwcmVzaWRlbnQgPC0gZmFjdG9yKGRhdGExJHByZXNpZGVudCwgbGV2ZWxzID0gcmV2KHByZXNpZGVudC5vcmRlcilbLTQwXSkKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xMX0KIyBUb3RhbCB3b3JkcwpwMTwtZGF0YTElPiUKICBnZ3Bsb3QoYWVzKHggPSBwcmVzaWRlbnQsIHkgPSBkYXRhMSRgVG90YWwgV29yZHNgLGdyb3VwPTEpKSArCiAgZ2VvbV9wb2ludChjb2xvcj0iZGFya3JlZCIpKwogIHN0YXRfc3VtbWFyeShmdW4ueT1zdW0sZ2VvbT0ibGluZSIsY29sb3I9ImRhcmtyZWQiKSsKICBsYWJzKHRpdGxlID0gIlRvdGFsIFdvcmRzIikgKwogICAgbGFicyh4ID0gIlByZXNpZGVudHMiLCB5ID0gIlRvdGFsIFdvcmRzIikgKwogIHRoZW1lLndpZGViYXIKCiMgVm9jYWJ1bGFyeQpwMjwtZGF0YTElPiUKICBnZ3Bsb3QoYWVzKHggPSBwcmVzaWRlbnQsIHkgPSBkYXRhMSRgVG90YWwgVm9jYWJ1bGFyeWAsZ3JvdXA9MSkpICsKICBnZW9tX3BvaW50KGNvbG9yPSJkYXJrcmVkIikrCiAgc3RhdF9zdW1tYXJ5KGZ1bi55PXN1bSxnZW9tPSJsaW5lIixjb2xvcj0iZGFya3JlZCIpKwogIGxhYnModGl0bGUgPSAiVG90YWwgVm9jYWJ1bGFyeSIpICsKICAgIGxhYnMoeCA9ICJQcmVzaWRlbnRzIiwgeSA9ICJUb3RhbCBWb2NhYnVsYXJ5IikgKwogICAgdGhlbWUud2lkZWJhcgoKZ3JpZC5hcnJhbmdlKHAxLCBwMiwgbmNvbCA9IDIpCmBgYAoKQXMgdGltZSBnb2VzIG9uLCBpbiBpbmF1Z3VyYXRpb24gc3BlZWNoLCB0aGUgdG90YWwgd29yZHMgYW5kIHRvdGFsIHZhY2FidWxhcnkgaGF2ZSBub3QgY2hhbmdlZCBhIGxvdCBhbmQgdGhpcyB2YWx1ZSBoYXMgdHVybmVkIHRvIGJlIHN0YWJsZSBpbiByZWNlbnQgc2V2ZXJhbCBkZWNhZGVzLiBGcm9tIHRoZSBmaWd1cmUsIHdlIGNhbiBzZWUgdGhhdCBpbiBlYXJseSBkYXlzLCBpdCB3YXMgdXN1YWwgdGhhdCB0aGUgdG90YWwgd29yZHMgb2Ygb25lIHllYXIgd2FzIG11Y2ggbW9yZSBvciBsZXNzIHRoYW4gdGhlIG5leHQgeWVhciBvciB0aGUgcHJldmlvdXMgeWVhci4gQnV0IG5vd2FkYXlzLCB0aGlzIG51bWJlciBoYXMgYmVlbiBzdGFiaWxpemVkIHRvIGJlIGFyb3VuZCAyMDAwLiBUaGlzIGlzIGJlY2F1c2UgdGhlIGluYXVndXJhdGlvbiBzcGVlY2ggaGFzIHBsYXllZCBhIG1vcmUgYW5kIG1vcmUgaW1wb3J0YW50IHJvbGUgdGhlc2UgeWVhcnMuIFByZXNpZGVudHMgdXNlIGl0IHRvIHNob3cgaGlzIHBsYW4gYW5kIHBvd2VyIGluIHRoZSBuZXh0IGZldyB5ZWFycy4gVGhlIGJlc3Qgd2F5IG1ha2luZyBhIHNwZWVjaCBzZXJpb3VzIGFuZCBmb3JtYWwgaXMgdG8gc3RhbmRhcmRpemUgdGhlIHNwZWVjaCBpbiB0ZXJtcyBvZiB0aGUgbGVuZ3RoIGFuZCBleHByZXNzaW9uLiBUaHVzLCB0aGUgdG90YWwgd29yZHMgaGF2ZSBiZWVuIGNvbnRyb2xsZWQuIAoKYGBge3IsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9MTF9CiNOdW1iZXIgb2Ygc2VudGVuY2VzCnAzPC1kYXRhMSU+JQogIGdncGxvdChhZXMoeCA9IHByZXNpZGVudCwgeSA9IGRhdGExJGBOdW1iZXIgb2YgU2VudGVuY2VzYCxncm91cD0xKSkgKwogIGdlb21fcG9pbnQoY29sb3I9ImRhcmtyZWQiKSsKICBzdGF0X3N1bW1hcnkoZnVuLnk9c3VtLGdlb209ImxpbmUiLGNvbG9yPSJkYXJrcmVkIikrCiAgbGFicyh0aXRsZSA9ICJOdW1iZXIgb2YgU2VudGVuY2VzIikgKwogICAgbGFicyh4ID0gIlByZXNpZGVudHMiLCB5ID0gIk51bWJlciBvZiBTZW50ZW5jZXMiKSArCiAgdGhlbWUud2lkZWJhcgoKIyBBdmVyYWdlIFdvcmRzIFBlciBTZW50ZW5jZQpwNDwtZGF0YTElPiUKICBnZ3Bsb3QoYWVzKHggPSBwcmVzaWRlbnQsIHkgPSBkYXRhMSRgQXZlcmFnZSBXb3JkcyBQZXIgU2VudGVuY2VgLGdyb3VwPTEpKSArCiAgZ2VvbV9wb2ludChjb2xvcj0iZGFya3JlZCIpKwogIHN0YXRfc3VtbWFyeShmdW4ueT1zdW0sZ2VvbT0ibGluZSIsY29sb3I9ImRhcmtyZWQiKSsKICBsYWJzKHRpdGxlID0gIkF2ZXJhZ2UgV29yZHMgUGVyIFNlbnRlbmNlIikgKwogICAgbGFicyh4ID0gIlByZXNpZGVudHMiLCB5ID0gIkF2ZXJhZ2UgV29yZHMgUGVyIFNlbnRlbmNlIikgKwogIHRoZW1lLndpZGViYXIKZ3JpZC5hcnJhbmdlKHAzLCBwNCwgbmNvbCA9IDIpCgpgYGAKCkhvd2V2ZXIsIGlmIGxvb2tpbmcgYXQgdGhlIG51bWJlciBvZiBzZW50ZW5jZXMgYW5kIHRoZSBhdmVyYWdlIHdvcmRzIHBlciBzZW50ZW5jZSwgd2UgY2FuIGZpbmQgdGhhdCB0aGVyZSBpcyBhIHVwdHJlbmQgZm9yIG51bWJlciBvZiBzZW50ZW5jZXMgYW5kIGFuIG9idmlvdXMgZGVzY2VuZCB0cmVuZCBmb3IgdGhlIGF2ZXJhZ2Ugd29yZHMgcGVyIHNlbnRlbmNlLCB3aGljaCBtZWFucyBQcmVzaWRlbnRzIHN0YXJ0ZWQgdG8gc2hvcnRlbiB0aGVpciBzZW50ZW5jZXMuIFRoYXQgbWlnaHQgYmVjYXVzZSB0aGUgcGFjZSBvZiBsaWZlIHR1cm5pbmcgbW9yZSBhbmQgbW9yZSBxdWljaywgcGVvcGxlIGhhdmUgYWxyZWFkeSBnb3QgdXNlZCB0byByZWFkaW5nIHNob3J0IHNlbnRlbmNlcyBwb3N0ZWQgb24gYWxsIGtpbmRzIG9mIHNvY2lhbCBBcHBzIHJhdGhlciB0aGFuIHJlYWRpbmcgbmV3c3BhcGVycyBhbmQgbG9uZyBzZW50ZW5jZXMuIEluZGVlZCwgc2hvcnRlciBzZW50ZW5jZXMgYXJlIG11Y2ggbW9yZSBhY2NlcHRhYmxlIGZvciBwZW9wbGUuIEFzIGEgcmVzdWx0LCBQcmVzaWRlbnRzIHN0YXJ0ZWQgdG8gdGFsayB0byBhbGwgb2YgdXMgYnkgc2hvcnRlbmluZyB0aGVpciBzZW50ZW5jZXMuCgpJZiBjb21iaW5pbmcgdGhlc2UgZm91ciBmaWd1cmVzLCB3ZSBzaG91bGQgbm90aWNlIHRoYXQgbm90IHRoZSBsZW5ndGggb2YgdGhlIHNwZWVjaCBidXQgdGhlIHBhY2Ugb2YgdGhlIHNwZWVjaCBpcyBjaGFuZ2luZy4KCiMjIyBXaGF0IHdvcmRzIGRpZCBQcmVzaWRlbnRzIHNheT8KYGBge3Igd29yZGNsb3VkLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcid9CmZvbGRlci5wYXRoPSIuLi9kYXRhL2Z1bGx0ZXh0LyIKc3BlZWNoZXM9bGlzdC5maWxlcyhwYXRoID0gZm9sZGVyLnBhdGgsIHBhdHRlcm4gPSAiKi50eHQiKQpwcmV6Lm91dD1zdWJzdHIoc3BlZWNoZXMsIDYsIG5jaGFyKHNwZWVjaGVzKS00KQoKbGVuZ3RoLnNwZWVjaGVzPXJlcChOQSwgbGVuZ3RoKHNwZWVjaGVzKSkKZmYuYWxsPC1Db3JwdXMoRGlyU291cmNlKGZvbGRlci5wYXRoLGVuY29kaW5nPSJVVEYtOCIpKQoKZmYuYWxsPC10bV9tYXAoZmYuYWxsLCBzdHJpcFdoaXRlc3BhY2UpCmZmLmFsbDwtdG1fbWFwKGZmLmFsbCwgY29udGVudF90cmFuc2Zvcm1lcih0b2xvd2VyKSkKZmYuYWxsPC10bV9tYXAoZmYuYWxsLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCJlbmdsaXNoIikpCmZmLmFsbDwtdG1fbWFwKGZmLmFsbCwgcmVtb3ZlV29yZHMsIGNoYXJhY3RlcigwKSkKZmYuYWxsPC10bV9tYXAoZmYuYWxsLCByZW1vdmVQdW5jdHVhdGlvbikKCmR0bSA8LSBEb2N1bWVudFRlcm1NYXRyaXgoZmYuYWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsaXN0KHdlaWdodGluZyA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRUZklkZih4LCBub3JtYWxpemUgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wd29yZHMgPSBUUlVFKSkKZmYuZHRtPXRpZHkoZHRtKQpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD03LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLGZpZy5hbGlnbj0nY2VudGVyJ30KcGFyKG1mcm93PWMoMiwyKSkKIyBEb25hbGQgVHJ1bXAKd29yZGNsb3VkKGZmLmR0bSR0ZXJtW2ZmLmR0bSRkb2N1bWVudD09c3BlZWNoZXNbOV1dLAogICAgICAgICAgZmYuZHRtJGNvdW50W2ZmLmR0bSRkb2N1bWVudD09c3BlZWNoZXNbOV1dLAogICAgICAgICAgc2NhbGU9YygzLDAuNSksCiAgICAgICAgICBtYXgud29yZHM9MjAwLAogICAgICAgICAgbWluLmZyZXE9MSwKICAgICAgICAgIHJhbmRvbS5vcmRlcj1GQUxTRSwKICAgICAgICAgIHJvdC5wZXI9MC4xLAogICAgICAgICAgdXNlLnIubGF5b3V0PUZBTFNFLAogICAgICAgICAgcmFuZG9tLmNvbG9yPUZBTFNFLAogICAgICAgICAgY29sb3JzPWJyZXdlci5wYWwoMTAsIlJlZHMiKSwgCiAgICAgICAgICBtYWluPXByZXoub3V0WzhdKQojQmFyYWNrIE9iYW1hCndvcmRjbG91ZChmZi5kdG0kdGVybVtmZi5kdG0kZG9jdW1lbnQ9PXNwZWVjaGVzWzZdXSwKICAgICAgICAgIGZmLmR0bSRjb3VudFtmZi5kdG0kZG9jdW1lbnQ9PXNwZWVjaGVzWzZdXSwKICAgICAgICAgIHNjYWxlPWMoMywwLjUpLAogICAgICAgICAgbWF4LndvcmRzPTIwMCwKICAgICAgICAgIG1pbi5mcmVxPTEsCiAgICAgICAgICByYW5kb20ub3JkZXI9RkFMU0UsCiAgICAgICAgICByb3QucGVyPTAuMSwKICAgICAgICAgIHVzZS5yLmxheW91dD1GQUxTRSwKICAgICAgICAgIHJhbmRvbS5jb2xvcj1GQUxTRSwKICAgICAgICAgIGNvbG9ycz1icmV3ZXIucGFsKDEwLCJSZWRzIiksIAogICAgICAgICAgbWFpbj1wcmV6Lm91dFs2XSkKI0dlb3JnZSBXIEJ1c2gKd29yZGNsb3VkKGZmLmR0bSR0ZXJtW2ZmLmR0bSRkb2N1bWVudD09c3BlZWNoZXNbMTldXSwKICAgICAgICAgIGZmLmR0bSRjb3VudFtmZi5kdG0kZG9jdW1lbnQ9PXNwZWVjaGVzWzE5XV0sCiAgICAgICAgICBzY2FsZT1jKDMsMC41KSwKICAgICAgICAgIG1heC53b3Jkcz0yMDAsCiAgICAgICAgICBtaW4uZnJlcT0xLAogICAgICAgICAgcmFuZG9tLm9yZGVyPUZBTFNFLAogICAgICAgICAgcm90LnBlcj0wLjEsCiAgICAgICAgICB1c2Uuci5sYXlvdXQ9RkFMU0UsCiAgICAgICAgICByYW5kb20uY29sb3I9RkFMU0UsCiAgICAgICAgICBjb2xvcnM9YnJld2VyLnBhbCgxMCwiUmVkcyIpLCAKICAgICAgICAgIG1haW49cHJlei5vdXRbMTldKQojV2lsbGlhbUpDbGludG9uCndvcmRjbG91ZChmZi5kdG0kdGVybVtmZi5kdG0kZG9jdW1lbnQ9PXNwZWVjaGVzWzUyXV0sCiAgICAgICAgICBmZi5kdG0kY291bnRbZmYuZHRtJGRvY3VtZW50PT1zcGVlY2hlc1s1Ml1dLAogICAgICAgICAgc2NhbGU9YygzLDAuNSksCiAgICAgICAgICBtYXgud29yZHM9MjAwLAogICAgICAgICAgbWluLmZyZXE9MSwKICAgICAgICAgIHJhbmRvbS5vcmRlcj1GQUxTRSwKICAgICAgICAgIHJvdC5wZXI9MC4xLAogICAgICAgICAgdXNlLnIubGF5b3V0PUZBTFNFLAogICAgICAgICAgcmFuZG9tLmNvbG9yPUZBTFNFLAogICAgICAgICAgY29sb3JzPWJyZXdlci5wYWwoMTAsIlJlZHMiKSwgCiAgICAgICAgICBtYWluPXByZXoub3V0WzUyXSkKYGBgCgpUaGUgd29yZCBjbG91ZCB0ZWNobm9sb2d5IHNob3dzIHVzIHdoYXQgZG9lcyBhIFByZXNpZGVudCBzYXkgbXVjaCBkdXJpbmcgdGhlIHNwZWVjaC4gRmlyc3QsIFByZXNpZGVudCBDbGludG9uLCB3aG8gd29uIHRoZSBjb21wZXRpdGlvbiBhZ2FpbnN0IEdlb3JnZSBCdXNoLiBBcyBhIHlvdW5nIHBvbGl0aWNpYW4gYXQgdGhhdCB0aW1lLCBoZSBmb2N1c2VkIG9uIGVjb25vbWljIHJldm9sdXRpb24uIFNvIGluIGhpcyBpbmF1Z3VyYXRpb24gc3BlZWNoLCB3ZSBjYW4gc2VlIHdvcmRzIGxpa2UgcmVuZXdhbCwgdG9kYXksIHJhaXNlLCBhbmQgc28gb24uIAoKQXMgZm9yIFByZXNpZGVudCBHZW9yZ2UgVyBCdXNoLCBqdXN0IGxpa2UgaGlzIGZhdGhlciwgaGUgZm9jdXNlZCBtb3JlIG9uIHNhZmV0eSBwcm9ibGVtcyBpbnNpZGUgYW5kIG91dHNpZGUgdGhlIGNvdW50cnkuIER1cmluZyBoaXMgdGVybSBvZiBvZmZpY2UsIFVTIGFybXkgaW52YWRlZCBJcmFxIGFuZCBBZmdoYW4uIEluIGhpcyBpbmF1Z3VyYXRpb24gc3BlZWNoLCB3ZSBzZWUgdHlyYW5ueSwgZmlyZSwgZGVmZW5kLCBldGMuIAoKUHJlc2lkZW50IE9iYW1hLCB0aGUgb25seSBQcmVzaWRlbnQgd2hvc2Ugd29yZCBjbG91ZCBkb2VzIG5vdCBjb250YWluIHRoZSB3b3JkIEFtZXJpY2EuIEhlIGlzIGtub3duIGFzIGEgcGVyc29uIHdobyBpcyByZWFsbHkgZ29vZCBhdCBzcGVlY2guIEluIGhpcyB3b3JkIGNsb3VkLCB3ZSBzZWUgam91cm5leSwgY3JlZWQsIHRlY2hub2xvZ3kuIEhlIGZvY3VzZWQgb24gdGhlIHJldm9sdXRpb24gYW5kIGhlIGxhdW5jaGVkIGEgc2VyaWVzIG9mIG5ldyBwb2xpY2llcyBkdXJpbmcgaGlzIHRlcm1zIG9mIG9mZmljZS4gSGUgc2FpZCBpbiB0aGUgaW5hdWd1cmF0aW9uIHNwZWVjaDogT3VyIEpvdXJuZXkgaXMgbm90IGNvbXBsZXRlLiAKCkZpbmFsbHksIFByZXNpZGVudCBUcnVtcCBoYWQgYmVlbiBmb2N1c2luZyBvbiBzb2x2aW5nIHRoZSBlbXBsb3ltZW50IHByb2JsZW0gYW5kIHByb3RlY3RpbmcgZG9tZXN0aWMgd29ya2VycyBiZWZvcmUgaGUgd29uIHRoZSBwcmVzaWRlbnRpYWwgZWxlY3Rpb24uIFNvIGR1cmluZyBoaXMgaW5hdWd1cmF0aW9uIHNwZWVjaCwgd2Ugc2VlIHdvcmRzIGxpa2Ugam9icywgZHJlYW1zLCBldmVyeW9uZSBmYWN0b3JpZXMsIHByb3RlY3RlZCwgZXRjLgoKV2hhdCdzIG1vcmUsIEkgZmluZCB0aGF0IHRocmVlIG9mIHJlY2VudCBmb3VyIHByZXNpZGVudHMgbG92ZWQgdG8gc2F5ICJBbWVyaWNhIiBpbiB0aGVpciBpbmF1Z3VyYXRpb24gc3BlZWNoLCBlc3BlY2lhbGx5IFByZXNpZGVudCBUcnVtcCwgaGUgaGl0IHRoZSB3b3JsZCBmb3IgMzUgdGltZXMuIFNvIEkgbWFkZSBhIHBsb3QgdG8gc2VlIGlmIHRoZXJlIGlzIGFueSB0cmVuZC4gCgoKIyMjIENvdW50IHRoZSBudW1iZXIgb2YgIkFtZXJpY2EiIGluIGluYXVndXJhdGlvbiBzcGVlY2hlcwpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD00LjUsIGZpZy53aWR0aD03LGZpZy5hbGlnbj0nY2VudGVyJ30KY291bnRfYW1lcmljYTwtbGFwcGx5KHdvcmRzLCBmdW5jdGlvbih4KXtsZW5ndGgoZ3JlcCgiQW1lcmljYSIsIHgpKX0pCm5hbWVzKGNvdW50X2FtZXJpY2EpPC1yb3duYW1lcyhjb3VudClbLTFdCgpyZXYucHJlc2lkZW50Lm9yZGVyPC1yZXYocHJlc2lkZW50Lm9yZGVyWy0xXSkKCmNvdW50LmFtZXJpY2E8LWMoKQpmb3IoaSBpbiAxOjM5KXsKYTwtY291bnRfYW1lcmljYVtuYW1lcyhjb3VudF9hbWVyaWNhKSA9PSByZXYucHJlc2lkZW50Lm9yZGVyW2ldXQpjb3VudC5hbWVyaWNhPC1jKGNvdW50LmFtZXJpY2EsYSkKfQoKYW1lcmljYTwtZGF0YS5mcmFtZShuYW1lPW5hbWVzKGNvdW50LmFtZXJpY2EpLCBjb3VudD1hcy5pbnRlZ2VyKGNvdW50LmFtZXJpY2EpKQphbWVyaWNhJG5hbWUgPC0gZmFjdG9yKGFtZXJpY2EkbmFtZSwgcmV2LnByZXNpZGVudC5vcmRlcikKCiNOdW1iZXIgb2YgQW1lcmljYQogIGdncGxvdChhbWVyaWNhLGFlcyh4ID0gbmFtZSwgeSA9IGNvdW50LCBncm91cD0xKSkgKwogIGdlb21fcG9pbnQoY29sb3I9ImRhcmtyZWQiKSsKICBzdGF0X3N1bW1hcnkoZnVuLnk9c3VtLGdlb209ImxpbmUiLGNvbG9yPSJkYXJrcmVkIikrCiAgbGFicyh4ID0gIlByZXNpZGVudHMiLCB5ID0gIk51bWJlciBvZiBBbWVyaWNhIikgKwogIHRoZW1lLndpZGViYXIKCmBgYAoKRnJvbSB0aGUgZmlndXJlIGFib3ZlLCBiZWdpbm5pbmcgZnJvbSBQcmVzaWRlbnQgV2FycmVuIEcuIEhhcmRpbmcgd2hvIHdhcyB0aGUgcHJlc2lkZW50IG9mIHRoZSBwb3N0IFdvcmxkIFdhciBwZXJpb2QsIHRoZSBudW1iZXIgb2YgdGhlIHdvcmQgQW1lcmljYSBoYXMgaW5jcmVhc2VkIGluIGEgaGlnaCBzcGVlZC4gVGhlIHdvcmQgIkFtZXJpY2EiIGlzIGEgZ29vZCB3YXkgdG8gc3RpbXVsYXRlIHBlb3BsZSdzIHBhdHJpb3Rpc20gZHVyaW5nIHRoZSBpbmF1Z3VyYXRpb24gc3BlZWNoLCBhbHNvIGEgZ29vZCB3YXkgdG8gd2luIHBlb3BsZSdzIGhlYXJ0cy4KCiMjIyBTZW50aW1lbnQgQW5hbHlzaXMgb2YgSW5hdWd1cmF0aW9uIHNwZWVjaGVzCmBgYHtyIHNlbnRpbWVudCwgaW5jbHVkZT1GQUxTRX0KZi5wbG90c2VudC5sZW49ZnVuY3Rpb24oSW4ubGlzdCwgSW5GaWxlLCBJblR5cGUsIEluVGVybSwgUHJlc2lkZW50KXsKICAKICBjb2wudXNlIDwtIGMoImJsdWUiLCAicmVkIikKICAKICBJbi5saXN0JHRvcGVtb3Rpb249YXBwbHkoc2VsZWN0KEluLmxpc3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnYXRpdmU6cG9zaXRpdmUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIHdoaWNoLm1heCkKICBJbi5saXN0JHRvcGVtb3Rpb24udj1hcHBseShzZWxlY3QoSW4ubGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnYXRpdmU6cG9zaXRpdmUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgbWF4KQogIAogIHRlbXAgPC0gSW4ubGlzdCR0b3BlbW90aW9uLnYKICBJbi5saXN0JHRvcGVtb3Rpb24udltJbi5saXN0JHRvcGVtb3Rpb249PTFdIDwtIC10ZW1wCiAgI0luLmxpc3QkdG9wZW1vdGlvbi52W2FicyhJbi5saXN0JHRvcGVtb3Rpb24udik8MC4wNV09MAogIAogIGRmIDwtIEluLmxpc3QlPiVmaWx0ZXIoRmlsZT09SW5GaWxlLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9PUluVHlwZSwgVGVybT09SW5UZXJtKSU+JQogICAgc2VsZWN0KHNlbnQuaWQsIHRvcGVtb3Rpb24sIHRvcGVtb3Rpb24udikKCiAgZGN0X3ZhbHVlcyA8LSBnZXRfdHJhbnNmb3JtZWRfdmFsdWVzKAogICAgZGYkdG9wZW1vdGlvbi52LCAKICAgIGxvd19wYXNzX3NpemUgPSA1LCAKICAgIHhfcmV2ZXJzZV9sZW4gPSAxMDAsCiAgICBzY2FsZV92YWxzID0gRiwKICAgIHNjYWxlX3JhbmdlID0gVAogICAgKQogIGRjdF9zaWducyA8LSAwLjUqc2lnbihkY3RfdmFsdWVzKSsxLjUKICBwdGNvbC51c2UgPC0gY29sLnVzZVtkY3Rfc2lnbnNdCiAgcGxvdChkY3RfdmFsdWVzLCAKICAgICAgIGNvbD1wdGNvbC51c2UsCiAgICAgICBsd2Q9IjIiLAogICAgICAgdHlwZT0iaCIsCiAgICAgICBtYWluPVByZXNpZGVudCwgeWxhYiA9ICJsZXZlbCIsIHhsYWIgPSAiVHJhbnNjcmlwdCBmcm9tIGJlZ2luaW5nIHRvIHRoZSBlbmQiKQogIGFibGluZShoPTAsbHdkPSIyIikKfQpgYGAKCkZpbmFsbHksIGluIHRoZSBzZW50aW1lbnQgYW5hbHlzaXMgcGFydCwgd2hldGhlciB0aGUgc2VudGltZW50IHdhcyBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBkdXJpbmcgdGhlIHdob2xlIHNwZWVjaCBwcm9jZXNzIGhhcyBiZWVuIHNob3dlZCBpbiB0aGUgZm9sbG93aW5nIGZpZ3VyZXMuIFJlZCBwYXJ0cyBtZWFuIHBvc2l0aXZlIGFuZCBibHVlIHBhcnRzIG1lYW4gbmVnYXRpdmUuCgpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnBhcihtZnJvdz1jKDEsMikpCmYucGxvdHNlbnQubGVuKEluLmxpc3Q9c2VudGVuY2UubGlzdCwgSW5GaWxlPSJEb25hbGRKVHJ1bXAiLCAKICAgICAgICAgICAgICAgSW5UeXBlPSJpbmF1ZyIsIEluVGVybT0xLCBQcmVzaWRlbnQ9IkRvbmFsZCBKLiBUcnVtcCIpCgpmLnBsb3RzZW50LmxlbihJbi5saXN0PXNlbnRlbmNlLmxpc3QsIEluRmlsZT0iQmFyYWNrT2JhbWEiLCAKICAgICAgICAgICAgICAgSW5UeXBlPSJpbmF1ZyIsIEluVGVybT0xLCBQcmVzaWRlbnQ9IkJhcmFjayBPYmFtYSIpCmBgYAoKRnJvbSB0aGUgcGxvdCwgYm90aCBQcmVzaWRlbnQgVHJ1bXAgYW5kIE9iYW1hIGhhcyBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgZW1vdGlvbiBkdXJpbmcgdGhlaXIgc3BlZWNoZXMsIGJ1dCBQcmVzaWRlbnQgVHJ1bXAncyBzcGVlY2ggaGFzIG1vcmUgbmVnYXRpdmUgZW1vdGlvbiwgd2hpY2gga25vd24gYXMgdW51c3VhbGx5IGRhcmsuIEhlIHNhaWQ6ICJGb3IgdG9vIGxvbmcsIGEgc21hbGwgZ3JvdXAgaW4gb3VyIG5hdGlvbidzIGNhcGl0YWwgaGFzIHJlYXBlZCB0aGUgcmV3YXJkcyBvZiBnb3Zlcm5tZW50IHdoaWxlIHRoZSBwZW9wbGUgaGF2ZSBib3JuZSB0aGUgY29zdCIuIEJ1dCBmb3J0dW5hdGVseSwgaGUgZW5kZWQgd2l0aCBwb3NpdGl2ZSBhbHRpdHVkZToiV2Ugd2lsbCBtYWtlIEFtZXJpY2Egc3Ryb25nIGFnYWluLiBXZSB3aWxsIG1ha2UgQW1lcmljYSB3ZWFsdGh5IGFnYWluLiBXZSB3aWxsIG1ha2UgQW1lcmljYSBwcm91ZCBhZ2Fpbi4iIEZyb20gdGhlIGZpZ3VyZSwgYXQgdGhlIGVuZCBvZiBoaXMgc3BlZWNoLCB0aGUgcG9zaXRpdmUgZW1vdGlvbiB3ZW50IHRvIHRoZSBoaWdoZXN0IHBvaW50LiAKYGBge3IsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgb3V0LndpZHRoPSI0MDBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIuLi9maWdzLzIuanBnIikKYGBgCgpBcyBmb3IgUHJlc2lkZW50IEJ1c2ggYW5kIFByZXNpZGVudCBDbGludG9uLCBzaW5jZSBhdCB0aGF0IHRpbWUsIEFtZXJpY2Egd2FzIGNvbmZyb250ZWQgd2l0aCBzb21lIHNlcmlvdXMgcHJvYmxlbXMgc3VjaCBhcyBlY29ub21pYyBwcm9ibGVtcyBhbmQgY291bnRyeSBzYWZldHkgcHJvYmxlbXMsIHRoZSBpbmF1Z3VyYXRpb24gc3BlZWNoZXMgd2VyZSBhIGxpdHRsZSBiaXQgbmVnYXRpdmUuIEZyb20gdGhlIHNlbnRpbWVudCBhbmFseXNpcywgd2UgY2FuIHNlZSBjbGVhcmx5IHRoYXQgdGhlIGJsdWUgcGFydHMgYXJlIGJpZ2dlciB0aGFuIHRoZSByZWQgcGFydHMuIEFuZCB0aGUgbmVnYXRpdmUgZW1vdGlvbiBhcHBlYXJlZCBhdCB0aGUgZW5kIG9mIHRoZSBzcGVlY2gsIHdoaWNoIG1lYW5zIGF0IHRoYXQgdGltZSwgZXZlbiB0aGUgUHJlc2lkZW50IGRpZCBub3QgaG9sZCBhIHBvc2l0aXZlIGF0dGl0dWRlIHRvd2FyZHMgdGhlIGZ1dHVyZSBvZiB0aGUgY291bnRyeS4KCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcGFyKG1mcm93PWMoMSwyKSkKZi5wbG90c2VudC5sZW4oSW4ubGlzdD1zZW50ZW5jZS5saXN0LCBJbkZpbGU9Ikdlb3JnZVdCdXNoIiwgCiAgICAgICAgICAgICAgIEluVHlwZT0iaW5hdWciLCBJblRlcm09MSwgUHJlc2lkZW50PSJHZW9yZ2UgVy4gQnVzaCIpCgpmLnBsb3RzZW50LmxlbihJbi5saXN0PXNlbnRlbmNlLmxpc3QsIEluRmlsZT0iV2lsbGlhbUpDbGludG9uIiwgCiAgICAgICAgICAgICAgIEluVHlwZT0iaW5hdWciLCBJblRlcm09MSwgUHJlc2lkZW50PSJXaWxsaWFtIEouIENsaW50b24iKQoKYGBgCgpUbyBzdW0gdXAsIHRoZSBzZW50aW1lbnQgYW5hbHlzaXMgY2FuIHNvbWVob3cgZGVtb25zdHJhdGVzIHRoZSBQcmVzaWRlbnQncyBhdHRpdHVkZSB0b3dhcmRzIHRoZSBmdXR1cmUgb2YgdGhpcyBjb3VudHJ5LgoKCg==